import { ref } from "vue";
import { deptTreeSelect } from "@/api/system/user";

/**
 * 部门树选择器工具类
 * 提供统一的部门树操作方法
 */
export class DeptTreeUtils {
  constructor() {
    this.deptOptions = ref(undefined);
    this.enabledDeptOptions = ref(undefined);
  }

  /**
   * 查询部门下拉树结构
   */
  async getDeptTree() {
    try {
      const response = await deptTreeSelect();
      this.deptOptions.value = response.data;
      this.enabledDeptOptions.value = this.filterDisabledDept(
        JSON.parse(JSON.stringify(response.data))
      );
      return response.data;
    } catch (error) {
      console.error('获取部门树失败:', error);
      throw error;
    }
  }

  /**
   * 过滤禁用的部门
   * @param {Array} deptList 部门列表
   * @returns {Array} 过滤后的部门列表
   */
  filterDisabledDept(deptList) {
    return deptList.filter((dept) => {
      if (dept.disabled) {
        return false;
      }
      if (dept.children && dept.children.length) {
        dept.children = this.filterDisabledDept(dept.children);
      }
      return true;
    });
  }

  /**
   * 处理部门树节点点击事件（用于表单中的树选择器）
   * @param {Object} data 节点数据
   * @param {Object} node 节点对象
   * @param {Event} e 事件对象
   * @param {Function} callback 回调函数，接收选中的部门ID
   * @param {Object} proxy Vue实例代理
   * @param {String} refName 树选择器的ref名称
   */
  handleFormDeptNodeClick(data, node, e, callback, proxy, refName = 'deptTreeSelectRef') {
    if (!data.children || data.children.length === 0) {
      // 叶子节点，执行选择逻辑
      if (callback && typeof callback === 'function') {
        callback(data.id);
      }
    } else {
      // 非叶子节点，切换展开状态
      node.expanded = !node.expanded;
      // 安全地调用 stopPropagation，避免在某些组件中事件对象不存在的问题
      if (e && typeof e.stopPropagation === 'function') {
        e.stopPropagation();
      }
      proxy.$nextTick(() => {
        if (proxy.$refs[refName]) {
          proxy.$refs[refName].focus();
        }
      });
    }
  }

  /**
   * 处理侧边栏部门树节点点击事件（用于查询过滤）
   * @param {Object} data 节点数据
   * @param {Function} callback 回调函数，接收选中的部门ID
   */
  handleSidebarDeptNodeClick(data, callback) {
    if (!data.children || data.children.length === 0) {
      // 叶子节点，执行查询逻辑
      if (callback && typeof callback === 'function') {
        callback(data.id);
      }
    }
  }

  /**
   * 获取部门选项数据
   */
  getDeptOptions() {
    return this.deptOptions;
  }

  /**
   * 获取启用的部门选项数据
   */
  getEnabledDeptOptions() {
    return this.enabledDeptOptions;
  }
}

/**
 * 创建部门树工具实例的组合式函数
 * @returns {Object} 包含部门树相关方法和数据的对象
 */
export function useDeptTree() {
  const deptTreeUtils = new DeptTreeUtils();

  return {
    // 数据
    deptOptions: deptTreeUtils.getDeptOptions(),
    enabledDeptOptions: deptTreeUtils.getEnabledDeptOptions(),
    
    // 方法
    getDeptTree: () => deptTreeUtils.getDeptTree(),
    filterDisabledDept: (deptList) => deptTreeUtils.filterDisabledDept(deptList),
    handleFormDeptNodeClick: (data, node, e, callback, proxy, refName) => 
      deptTreeUtils.handleFormDeptNodeClick(data, node, e, callback, proxy, refName),
    handleSidebarDeptNodeClick: (data, callback) => 
      deptTreeUtils.handleSidebarDeptNodeClick(data, callback),
  };
}